package godzilla.ciudad.recursos;

import java.util.Iterator;
import java.util.LinkedList;


public class ListaDeRecursos {

	private LinkedList<Recurso> lista;
	
	public ListaDeRecursos(){
		lista = new LinkedList<Recurso>();
	}

	public boolean contiene(Recurso recursoBuscado) {
		
		Recurso recursoComparado;
		Iterator<Recurso> iterador = this.lista.iterator();
		while (iterador.hasNext()){
			recursoComparado = iterador.next();
			if (recursoComparado.esEquivalenteA(recursoBuscado)){
				return true;
			}
		}
		return false;

	}

	public void agregar(Recurso recursoAgregado) {

		this.lista.add(recursoAgregado);
		
	}

	public boolean contieneEstaLista(ListaDeRecursos listaAObservar) {
		
		Iterator<Recurso> iterador = listaAObservar.lista.iterator();
		
		while(iterador.hasNext()){
			
			if (!this.contiene(iterador.next())) return false;
			
		}
		
		return true;
		
	}

	public Iterator<Recurso> iterador() {

		return this.lista.iterator();
	}

	public Recurso extraerRecurso(Recurso recursoBuscado) {

		Recurso recursoComparado;
		Iterator<Recurso> iterador = this.lista.iterator();
		while (iterador.hasNext()){
			recursoComparado = iterador.next();
			if (recursoComparado.esEquivalenteA(recursoBuscado)){
				return recursoComparado;
			}
		}
		return null;
		
	}

	public boolean estaVacia() {
		return lista.isEmpty();
	}

	public boolean contieneExactamente(Recurso recursoBuscado) {

		return this.lista.contains(recursoBuscado);
	}

	public void obtenerRecursosQueSeNecesiten(
			ListaDeRecursos listaObservada,
			ListaDeRecursos listaDeObjetosBuscados) {

		Iterator<Recurso> iterador = listaDeObjetosBuscados.lista.iterator();
		while (iterador.hasNext()){
			Recurso recursoBuscado = iterador.next();
			if (listaObservada.contiene(recursoBuscado) && !this.contiene(recursoBuscado)){
				this.agregar(listaObservada.extraerRecurso(recursoBuscado));
			}
		}
		
		
	}

	public void vaciar() {

		while(!this.lista.isEmpty()){
			this.lista.getFirst().liberarEstructurasUsandome();
			this.lista.removeFirst();
		}

		
	}
	
	
	
}
